// Code generated by protoc-gen-go. DO NOT EDIT.
// source: device/model_id.proto

package device

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// Globally unique identifier.
type ModelId struct {
	// Required. Source: 'mosys platform model'.
	Value                string   `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ModelId) Reset()         { *m = ModelId{} }
func (m *ModelId) String() string { return proto.CompactTextString(m) }
func (*ModelId) ProtoMessage()    {}
func (*ModelId) Descriptor() ([]byte, []int) {
	return fileDescriptor_cfe7d1a954e827c8, []int{0}
}

func (m *ModelId) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ModelId.Unmarshal(m, b)
}
func (m *ModelId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ModelId.Marshal(b, m, deterministic)
}
func (m *ModelId) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ModelId.Merge(m, src)
}
func (m *ModelId) XXX_Size() int {
	return xxx_messageInfo_ModelId.Size(m)
}
func (m *ModelId) XXX_DiscardUnknown() {
	xxx_messageInfo_ModelId.DiscardUnknown(m)
}

var xxx_messageInfo_ModelId proto.InternalMessageInfo

func (m *ModelId) GetValue() string {
	if m != nil {
		return m.Value
	}
	return ""
}

func init() {
	proto.RegisterType((*ModelId)(nil), "device.ModelId")
}

func init() { proto.RegisterFile("device/model_id.proto", fileDescriptor_cfe7d1a954e827c8) }

var fileDescriptor_cfe7d1a954e827c8 = []byte{
	// 121 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4d, 0x49, 0x2d, 0xcb,
	0x4c, 0x4e, 0xd5, 0xcf, 0xcd, 0x4f, 0x49, 0xcd, 0x89, 0xcf, 0x4c, 0xd1, 0x2b, 0x28, 0xca, 0x2f,
	0xc9, 0x17, 0x62, 0x83, 0x08, 0x2b, 0xc9, 0x73, 0xb1, 0xfb, 0x82, 0x64, 0x3c, 0x53, 0x84, 0x44,
	0xb8, 0x58, 0xcb, 0x12, 0x73, 0x4a, 0x53, 0x25, 0x18, 0x15, 0x18, 0x35, 0x38, 0x83, 0x20, 0x1c,
	0x27, 0xa3, 0x28, 0x83, 0xf4, 0x7c, 0xbd, 0xe4, 0x8c, 0xa2, 0xfc, 0xdc, 0xcc, 0xd2, 0x5c, 0xbd,
	0xfc, 0xa2, 0x74, 0x7d, 0x18, 0x27, 0xbf, 0x58, 0x3f, 0x33, 0x2f, 0xad, 0x28, 0x51, 0x1f, 0x6c,
	0xa4, 0x7e, 0x7a, 0xbe, 0x3e, 0xc4, 0xd0, 0x24, 0x36, 0xb0, 0x80, 0x31, 0x20, 0x00, 0x00, 0xff,
	0xff, 0x9a, 0xd0, 0x1d, 0x41, 0x7c, 0x00, 0x00, 0x00,
}
